import { reactive, setOb } from '.'
import { isArray } from '../share'
import Dep from './dep'

export function defineProperty(target, key, value) {
  // 递归注册
  reactive(value)
  const dep = new Dep()
  if (isArray(target) && !target.__ob__) {
    setOb(target, { dep })
    return
  }
  Object.defineProperty(target, key, {
    get() {
      // 收集依赖
      dep.append()
      // 返回值
      return value
    },
    set(val) {
      if (value === val) return
      value = val
      // 设置响应式
      reactive(value)
      // 触发更新
      dep.notify()
      // 返回值
      return val
    },
    configurable: true,
    enumerable: true
  })
  return dep
}
